Spiele knacken - mit Freezern 0 Problem So ein Freezer ist wirklich eine feine Sache. Auf Knopfdruck killt er die Spritekollisionen oder verschafft uns unendliche Leben. Was machen wir aber, wenn diese Funktionen versagen oder wir etwas Spezielleres benötigen? Dann kramen wir unsere Assemblerbücher hervor und erledigen die Sache per Hand. Wie so etwas gemacht wird, zeigt der folgende Text: Wir bearbeiten Manfred Trenz' Meister- werk namens "Turrican II" mit dem Action Replay 6 (Natürlich sind alle Schritte locker auf einen anderen Freezer über- tragbar). Zuerst laden wir das Spiel ein. Wie beginnen wir nun, wenn wir zum Beispiel die Lebensanzahl ändern wollen? 64kB einzeln durchzusehen, ist gewiß nicht die günstigste Variante. Nutzen wir deshalb die Schwäche jedes Spieles aus: die Bild- schirmanzeige. Denn durch sie können wir leicht die ganze Sache zurückverfolgen. Betrachten wir dazu den Bildschirm- aufbau: im oberen Teil herrscht die große Action, und im unteren Bereich können wir die aktuellen Spielstands- werte ablesen. Dort finden wir auch die Lebensanzahl, der es jetzt ja an den Kragen gehen soll. Drücken wir doch einfach mal den Freezerknopf und schauen uns mit "F7" das Bild an. Huch! Wir erkennen nur einen Teil ordentlich! Das liegt an der Umschaltung durch den Rasterstrahl und soll uns nicht weiter kümmern. Das einzige Problem dabei: wir müssen jetzt solange zwischen Spiel und Freezer wechseln, bis wir den unteren Teil erwischt haben. Ist das dann gemeistert, wird es ernst. Wir springen mit "T" in den Texteditor und bewegen den Cursor ein bißchen hoch, ein bißchen nach unten, oder mal nach rechts und links. Was stellen unsere geschulten Augen dabei fest? Die Positionstionsangaben des Text- editors sind höchst unleserlich. Eigent- lich auch logisch, da ein anderer Zei- chensatz verwendet wird. So kommen wir also erst einmal nicht weiter. Wir machen einen Abstecher in den Sprite- Editor ("V"). Er verrät uns, daß Bank Numero 3 eingeschalten ist. Bekanntlich ist der C64 in vier Banken von 0 bis 3 eingeteilt. Bank 3 wurde desweiteren ein Originalzeichensatz spendiert. Da wir uns schon in diesem Bereich befinden, nutzen wir diese Spende natürlich scham- los aus: Wir verlassen flugs mit "Q" den Editor und stürzen uns mit "M" in den Monitor. Wie wir in der Anleitung unseres Freezer hoffentlich gelesen haben, zeigt der "IO"-Befehl die aktuellen VIC-Werte. Was steht da in $D018, dem Zeichensatz- register? Eine $11, die wir auf schnell- stem Wege in den Wert $15 wandeln, damit wir den begehrten Originalzeichensatz erhalten. Ein erneuter Blick in den Texteditor läßt uns hoffen: die Posi- tionsangaben sind zur Hälfte leserlich. Warum nur zur Hälfte? Ganz klar, das Problem ist 100%-ig ein verschobener Bildschirm. Doch wir beherrschen ja den "IO"-Befehl und entlasten so Adresse $D011 (setzen sie auf $00). Nun schalten wir hurtig in den Texteditor. Wir fahren auf die Stelle, wo der Einer der Lebens- anzahl steht (wir waren doch so klug und haben sie im Originalbild mit einem Buchstaben markiert, nicht wahr?). Unten lesen wir ab: $0776. Werfen wir doch mal einen Blick in den Monitor, ob es da eine Verbindung gibt. Der Befehl "H0000FFFF7607" (Suche von $0000 bis $FFFF nach $76+$07) bringt es ans Licht. Es erscheint $4B95. Was mag wohl in ihr Geheimnisvolles darin gespeichert sein? Wir disassemblieren den Bereich mit D4B94 (nicht mit D4B95, da ja immer ein Befehl vor einer Adresse steht). Aha: STA $0776 erscheint. Scrollen wir weiter hinunter, gesellen sich noch ein ADC #$0A, ein STA $079E und ein RTS hinzu. Letztere Befehle dienen allein der Darstellung der übergroßen Zahl und haben mit dem Inhalt der Lebensmenge nichts mehr am Hut. Nunja, stellen wir ersteinmal das STA $0776 ruhig, indem wir ein LDA $0776 draus machen. Nun nehmen wir wieder den Joystick in die Hand und zerstören mutwillig einige Leben unseres Helden. Unser Unternehmen scheint geglückt zu sein: die Lebenszahl bleibt gleich ... Schreck!Ein "Continue Yes/No" erscheint (wir wählen natürlich "Yes"). Was haben wir falsch gemacht? Nun, wir haben lediglich die Bildschirmausgabe unter- drückt und mehr noch nicht. Also listen wir erneut Adresse $4B94 (schärfen sie wieder mit einem STA) und scrollen dies- mal hinauf, immer auf der Suche nach einem Verringerungsbefehl wie DEC, SBC u.ä.. Bei $4B67 werden wir fündig: SBC #$01, darüber ein LDA $FFFC. Begut- achten wir mit MFFFC den Inhalt dieser Adresse. Schön, er entspricht unserer Lebensanzahl. Verändern wir ihn einfach mal. Zurück im Spiel scheint sich nichts getan zu haben; unsere alte Lebenshan- zahl steht noch wacker da. Argh! Vor Wut stürzen wir uns in den Abgrund (im Spiel natürlich) - und siehe da! Wir haben ganze Arbeit geleistet, Wir erinnern uns an das SBC #$01 zurück und ersetzen es durch ein SBC #$00. Nun werden wir kein Leben mehr flöten hören! Widmen wir uns jetzt der Energie. Durch die gleiche Prozedur wie bei der Lebens- anzahl erhalten wir die Bildschirm- adresse $0768 (gemessen am Anfang des Energiebalkens). Suchen wir den Speicher nach ihr durch (H0000FFFF6807), werden uns diesmal mehrere Werte geliefert. Wir disassemblieren jede der Adressen (D4C0C, D4C15 usw.) und erhalten einen STA,zwei LDAs,einen INC und einen DEC $0768,X. In Frage für eine Manipulation kommen nur die Speicherstellen $4C0C (STA) und $4C52 (DEC), da allein sie die Adresse $0768 verringern (können). Probieren wir es zuerst mit dem DEC- Befehl bei $4C52 aus (DEC wird in solchen Fällen häufiger eingesetzt; STA ist jedoch flexibler {Energieerhöhung z.B.}). Wir wandeln ihn in einen LDA $0768,X. Zurück im Spiel probieren wir durch Dauerbelastung unseres Heldens aus, ob vielleicht wieder nur die Bild- schirmausgabe unterdrückt ist ... Nein, diesmal klappts! Also können wir uns getrost der Zeit zuwenden. Als Bild- schirmadresse bekommen wir $07A4. Ein Durchsuchen (H0000FFFFA407) bringt Adresse 4BFA ans Licht. Wir disassemb- lieren sie (D4BF9) und scrollen ein Stückchen nach oben. Wir können ein LDA $080F,X und ein ADC #$A2 lesen. Ins Deutsche übersetzt, bedeutet das: der Inhalt aus der Zelle ($080F+Wert des X-Register) wird mit $A2 addiert (und in $07A4 plus dem Y-Register abgelegt.) Puh! Falls man das einigermaßen verstan- den hat, merkt man, daß Adresse $080F die Quelle des Übels ist. Flugs durch- suchen wir den Speicher nach $080F (H0000FFFF0F08) und erhalten mehrere Adressen. Schauen wir sie uns kurz an. In D0C0D strahlt uns ein gefährlicher DEC-Befehl entgegen. Schnell ersetzen wir ihn durch ein harmloses LDA. Der Test gibt uns recht: das Unternehmen ist geglückt. Von nun an können wir unseren Helden beliebig lang nach Geheimräumen u.ä. suchen lassen. Die Sache mit den Continues sollte jeder nun selbst knacken können. Hier die Kurzform: Die Bildschirmadresse lautet $0778. Die Speicherdurchsuchung läßt ein 4BE7 erscheinen. Durch ein Hochscrollen entlarven wir die Quelle $DBFF. Wir suchen nach ihr (H0000FFFFFFDB) und disassemblieren alle erschienen Adressen und stoßen bei $4F6b auf einen DEC- Befehl. Diesen wandeln wir wie immer in einen LDA um. Bei den SPACE-Tasten-Waffen wollen (müssen) wir andere Wege gehen. Hierzu ist mehr Theorie erforderlich. Zuerst müssen wir wissen, wie man die SPACE- Taste abfragen kann: Da ist z.B. Adresse $DC01, in der auch Joystickport Nr.1 seine Werte abspeichert. Durchsuchen wir den Speicher nach ihr. Wir bekommen einige Adressen geliefert; zu viele, würde ich meinen. Deshalb gehen wir anders an das Problem heran: Auf welche Weise fragt man die SPACE-Taste überhaupt ab? Im Basic checkt man meistens nach 239. In Assembler kümmert man sich eher um die einzelnen Bits. Bis auf Bit 4 sind alle gesetzt (%11101111 = 239 = $EF). Bit 4 hat den Wert $10. Die Wahrscheinlichkeit ist groß, daß der Programmierer die Abfrage deswegen so gestaltet hat: LDA $DC01 AND #$10 ... Wenn wir nun den Speicher nach dieser Möglichkeit durchsuchen wollen, müssen wir irgendwie die hexadezimalen Wert kennen. Entweder wir schauen in ein kluges Buch oder wir nutzen einen genialen Trick (schon deshalb ist dieser Artikel lesenswert) und geben Mxxxx ein (xxxx = beliebige vierstellige Zahl). Nun schalten wir den Assembler mit "A"+"der Zahl von vorhin"+"dem LDA $DC01 ein". Ein Beispiel gefällig? Nehmen wir für "xxxx" $5000. Also tippen wir M5000, eine Zeile "Zahlen" er- scheint. Nun geben wir A5000 LDA $DC01 ein. Daraufhin tippen wir noch AND #$10. Wir erhalten die Hexzahlen AD,01,DC,29, 10. Wir bewegen den Cursor nun auf die Stelle, an der die Reihe von dem Mxxxx-Befehl steht und drücken Return. Damit erhalten wir den Original- zustand. Puh! Jetzt checken wir den Speicher nach den gefundenen Hexwerten: H0000FFFFAD01DC2910. Wir bekommen zwar wieder mehrere Adressen serviert, aber lange noch nicht zu viele wie vorhin. Wir testen die Adresse $119B, indem wir das LDA $DC01 durch ein LDA #$00 NOP ersetzen. Zurück im Spiel scheint sich nichts getan zu haben: die SPACE-Taste funktioniert noch einwandfrei. Also schreiben wir den Originalwert in $119B zurück und wenden uns der zweiten Adresse, $2F9D, zu. Erneut ändern wir ein LDA #$00 NOP daraus. Dann schalten wir zum Spiel. Schreck! Unsere Manipulation simuliert einen Dauerdruck der SPACE-Taste! Wir setzen darum die Adresse $2F9D auf ihren Originalwert zurück und scrollen etwas weiter nach unten. Da fällt plötzlich ein JSR $4BA9 ins Licht der Manipulatio- nen. Hatten wir nicht fast die ganze Zeit im $4000 Bereich 'rumgefuscht? Wir listen also ein Stück von $4BA9. Häufig sehen wir die Adresse $0737. Wahrschein- lich steht dort irgenwo die Strahlen- zahl drin. Außerdem stört uns ein SBC #$01, das wir schnellstens entschärfen. Nun hat die Simulation des "DauerSPACE"s aber alle unsere Strahlen verbraucht ... Kurzum, wir müssen diesmal noch die Anzahl hochsetzen. Wir erinnern uns: nach dem häufigen Wert $0737 stand ein ",X" ($0737,X). Für X können Werte von $00 bis $FF stehen. Deshalb ist es durchaus möglich, daß wir erst bei $0826 fündig werden. Glücklicherweise steht die Strahlenanzahl aber schon bei $0738. Die nachfolgende Zahl ($0739) beinhaltet die Superweapon. Wir manipulierten: Setzten,auf Wertadr. Bemerkungen
Leben: $4B68 ,$00 $FFFC (Poke) 19304 , 00 Energie: $4C52 ,$BD $0768 (Poke) 19538 ,189 Zeit: $0C0D ,$AD $080F (Poke) 3058 ,173 Continue: $4F6B ,$AD $DBFF Wertadresse (Poke) 20331 ,173 nicht ohne Weiteres zu ändern Weapon: $4BB2 ,$00 $0738 (Poke) 19378 , 00
Super-Weapon: $430D ,$2C $0739 (Poke) 17165 , 44 Einige Schmankerle noch zum Schluß: Nextlevel: G(O) 5469 Waffe: $0702 den JMP-Befehl verändern: Grün: $35CF (Stärke in $07EF) Rot : $3182 (Stärke in $07EE) Lila: $4493
(cj/wk)